package com.youshang520i.service.impl;

import com.youshang520i.dao.StudentDao;
import com.youshang520i.dao.TeacherDao;
import com.youshang520i.model.TeacherModel;
import com.youshang520i.service.StudentService;
import com.youshang520i.service.TeacherService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;

import java.sql.SQLException;
import java.util.List;

/**
 * @author youshang
 */
@Service
public class TeacherServiceImpl implements TeacherService {

    @Autowired
    private TeacherDao teacherDao;

    @Override
    public List<TeacherModel> selectList() {
        return teacherDao.selectList();
    }

    /**
     * 如果当前没有事务，就创建一个新事务，如果当前存在事务，就加入该事务，该设置是最常用的设置。
     * Propagation支持7种不同的传播机制：
     * REQUIRED：如果存在一个事务，则支持当前事务。如果没有事务则开启一个新的事务。                    结果：事务生效
     * SUPPORTS： 如果存在一个事务，支持当前事务。如果没有事务，则非事务的执行。但是对于事务同步的事务管理器，SUPPORTS 与不使用事务有少许不同。  结果：事务生效
     * NOT_SUPPORTED：总是非事务地执行，并挂起任何存在的事务。                                    结果：事务不生效，原因：非事务
     * REQUIRES_NEW：总是开启一个新的事务。如果一个事务已经存在，则将这个存在的事务挂起。              结果：事务不生效, 原因：单独创建了新事务
     * MANDATORY：如果已经存在一个事务，支持当前事务。如果没有一个活动的事务，则抛出异常。              结果：事务生效
     * NEVER：总是非事务地执行，如果存在一个活动事务，则抛出异常                                    结果：事务不生效, 原因：因为存在事务而异常
     * NESTED：如果一个活动的事务存在，则运行在一个嵌套的事务中。如果没有活动事务，则按REQUIRED属性执行。 结果：事务不生效,原因：因为开启了新事务
     * 总结：当上游不开启事务的时候，下游不管使用什么事务都会失效
     *
     * @param teacherModel
     * @return
     */
    @Override//rollbackFor = SQLException.class
    @Transactional(rollbackFor = Exception.class,propagation = Propagation.REQUIRES_NEW)
    public int insert(TeacherModel teacherModel) {
        return teacherDao.insert(teacherModel);
    }
}
